package com.yl.demo.base.filter;

import com.yl.demo.base.config.shiro.CustomCredentialsMatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 跨域问题
 * 由于开发中前端工程使用webpack启了一个服务，所以前后端并不在一个端口下，必然涉及到跨域：
 * XMLHttpRequest会遵守同源策略(same-origin policy). 也即脚本只能访问相同协议/相同主机名/相同端口的资源,
 * 如果要突破这个限制, 那就是所谓的跨域, 此时需要遵守CORS(Cross-Origin Resource Sharing)机制。
 * 解决跨域分两种：
 * 1.server端是自己开发的，这样可以在在后端增加一个拦截器
 */
@Component
public class CommonIntercepter implements HandlerInterceptor {

    private final static Logger logger = LoggerFactory.getLogger(CustomCredentialsMatcher.class);

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        //允许跨域,不能放在postHandle内
        response.setHeader("Access-Control-Allow-Origin", "*");
        if ("OPTIONS".equals(request.getMethod())) {
            response.addHeader("Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH");
            /**
             * 由于我们在前后端分离中集成了shiro，因此需要在headers中自定义一个'Authorization'字段，
             * 此时普通的GET、POST等请求会变成preflighted request，即在GET、POST请求之前会预先发一个OPTIONS请求，
             * 这个后面再说。推荐一篇博客介绍 preflighted request。
             */
            response.addHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization");
        }
        return true;
    }
}